import router from "@/router/index";
import {useMenusStore} from "@/store/permission";
import Home from '@/views/home/index.vue'
import NProgress from 'nprogress' // 进度条
import 'nprogress/nprogress.css'//进度条样式
import {getToken} from "@/util/token/getToken";
//路由白名单（静态路由）
const Whitelist = ['/', '/login', '/error', '/404']
//全局路由守卫
router.beforeEach((to, from, next) => {
    NProgress.start();
    const store = useMenusStore()
    const hasetoken = getToken('token')//通过判断token是否存在来确定用户是否登录
    if (to.path == "/login" && hasetoken) {
        //如果已经登录却还在访问登录页，直接跳转首页
        next('/home')
    }
    if (Whitelist.indexOf(to.path) == -1) {
        //当前路由没有在白名单里面
        if (store.RouterList.length == 0 && hasetoken) {//store.RouterList.length == 0：通过判断RouterList数组的长度来确定是否已经生成动态路由
 
            //已经登录，但是还没有获取路由数据，或者说丢失了路由数据，立即获取用户信息，并创建动态路
            // getPermission：该方法会发送请求获取用户的权限数据（一般情况会将获取用户信息和生成动态路由步骤分开操作，我这里比较懒，就直接写在一起了）
            store.getPermission().then(() => {
                const routerlist = store.RouterList//用户的路由数据
                //创建动态路由
                router.addRoute(//该方法只会添加一个路由(因为我的子路由都在这个home路由下）如果你要添加的路由是一个数组，请使用addRoutes函数
                    {
                        path: '/home',
                        name: 'Home',
                        component: Home,
                        redirect: '/home/homepage',
                        children: routerlist//注意routerlist的数据必须是格式化成路由格式了才行，具体格式化方法就在pinia中的setRouterList方法
                    }
                )
               return  next({...to, replace: true})//确保路由加载完毕，注意这里他不会继续往下执行了，他会重新进入路由守卫。为了避免误会，这里就直接return
                //而这第二次在进入这个守卫时动态路由已经添加完成，RouterList的长度已经不为0了，所以就不会进入这个判断里面，转而执行下面的eles
            })
        } else {
            /*两种情况进入：1：已经获取了路由（一定有token），2，没有登录（一定没有路由）*/
            NProgress.done()
            // if (hasetoken && to.matched.length != 0) {
            if (hasetoken && router.hasRoute(to.name)) {
                /*to.matched.length === 0或者router.hasRoute(to.name)判断当前输入的路由是否具有，即使登陆了，如果输入不能访问的路由也要404*/
                /*已经获取了路由并且具备访问路由权限，需要放行*/
                next()
            } else {
                next('/404')
            }/*没有登录或者登录了但是访问路由不对，需要404，也可以选择跳转登录页*/
        }
    } else {
        NProgress.done()
        /*当前路由在白名单里面，直接放行*/
        next()
    }
})